// 版权所有2010 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package cipher

import "io"

// Stream*对象非常简单，其所有成员都是公共的。用户
// 可以自己创建。

// StreamReader将流包装到io中。读者它调用XORKeyStream 
// 来处理通过的每个数据片段。
type StreamReader struct {
	S Stream
	R io.Reader
}

func (r StreamReader) Read(dst []byte) (n int, err error) {
	n, err = r.R.Read(dst)
	r.S.XORKeyStream(dst[:n], dst[:n])
	return
}

// StreamWriter将流包装到io中。作家它调用XORKeyStream 
// 来处理通过的每个数据片段。如果任何写入调用
// 返回short，则StreamWriter不同步，必须丢弃。
// StreamWriter没有内部缓冲；Close不需要调用
// 来刷新写入数据。
type StreamWriter struct {
	S   Stream
	W   io.Writer
	Err error // 未使用的
}

func (w StreamWriter) Write(src []byte) (n int, err error) {
	c := make([]byte, len(src))
	w.S.XORKeyStream(c, src)
	n, err = w.W.Write(c)
	if n != len(src) && err == nil { // 不应发生
		err = io.ErrShortWrite
	}
	return
}

// 关闭关闭基础写入程序并返回其关闭返回值，前提是写入程序
// 也是io。更接近。否则返回零。
func (w StreamWriter) Close() error {
	if c, ok := w.W.(io.Closer); ok {
		return c.Close()
	}
	return nil
}
